//
//  Problem520.swift
//  TestProject
//
//  Created by 毕武侠 on 2021/4/8.
//  Copyright © 2021 zhulong. All rights reserved.
//

import UIKit

/*
 520. 检测大写字母
 给定一个单词，你需要判断单词的大写使用是否正确。
 我们定义，在以下情况时，单词的大写用法是正确的：
     全部字母都是大写，比如"USA"。
     单词中所有字母都不是大写，比如"leetcode"。
     如果单词不只含有一个字母，只有首字母大写， 比如 "Google"。
     否则，我们定义这个单词没有正确使用大写字母。

 示例 1:
     输入: "USA"
     输出: True
 示例 2:
     输入: "FlaG"
     输出: False
 注意: 输入是由大写和小写拉丁字母组成的非空单词。
 */
@objcMembers class Problem520: NSObject {
    func solution() {
        print(detectCapitalUseUp("USF"))
        print(detectCapitalUseUp("FlaG"))
        print(detectCapitalUseUp("rlah"))
        print(detectCapitalUseUp("rlEh"))
        print(detectCapitalUseUp("Rlth"))
    }
    
    /*
     1: 首先判断第一个字符：如果是小写，那么所有的是小写
     2: 如果是大写，判断第二个：大写，那么所有都是大写，小写：后面都是小写
     */
    func detectCapitalUse(_ word: String) -> Bool {
        if word.count == 1 {
            return true
        }
        let charts = Array(word)
        if charts[0].isLowercase, charts[1].isUppercase {
            return false
        }
        if charts.count == 2 {
            return true
        }
        
        var isLower = true
        if charts[0].isUppercase, charts[1].isUppercase {
            isLower = false
        }
        
        if isLower == true {
            for i in 2..<charts.count {
                if charts[i].isLowercase == false {
                    return false
                }
            }
        } else {
            for i in 2..<charts.count {
                if charts[i].isUppercase == false {
                    return false
                }
            }
        }
        
        return true
    }
    
    /*
     计算大写的个数n
     1: n = len 都是大写
     2: n = 0 都是小写
     3: n = 1, 并且 第一个字符是大写 也是符合的
     4: 其他都是false
     */
    func detectCapitalUseUp(_ word: String) -> Bool {
        if word.count == 1 {
            return true
        }
        var n = 0
        for c in word {
            if c.isUppercase {
                n += 1
            }
        }
        if n == word.count || n == 0 {
            return true
        }
        if n == 1, word.first!.isUppercase == true {
            return true
        }
        return false
    }
}
